/**
 * @author 陈泰来
 * @version V1.0
 * @Project echo-java-base
 * @Title
 * @Description String.intern()返回引用的测试
 * @Package jvm.exception
 * @date 2021/3/25 10:27 上午
 * @Copyright:学如逆水行舟，不进则退 .
 */
package jvm.exception;

public class RuntimeConstantOOM {


    public static void main(String[] args) {
        //"哈哈你好"，是首次出现在 JVM中，第一次添加到常量池的引用等于第一创建字符串时的引用，所有这里返回的是刚刚添加进去的引用，由于引用是相同的，所以这里两者实际上是指向一样的字符串对象。所以这里是true
        String sb1 = new StringBuilder().append("哈哈").append("你好").toString();
        System.out.println(sb1 == sb1.intern());


        //JDK1.7之后  JVM  中 java  字符串之前已经出现在常量池中，所以调用 "java".intern()后返回的是常量池中已有的"java"字符串的引用。这个引用一定不会等于刚刚新建的StringBuilder对象的引用。所以这里是false
        String sb2 = new StringBuilder().append("ja").append("va").toString();
        System.out.println(sb2 == sb2.intern());

        //这里和上面的 "java" 一样，sb3.intern()返回的是第一次出现时的引用（实际上指的就是 sb1.intern,可以看最后一个比较返回的true），但是sb3是一个新对象，所以它的引用必然不会等于sb3.intern()
        String sb3 = new StringBuilder().append("哈哈").append("你好").toString();
        System.out.println(sb3 == sb3.intern());
        System.out.println(sb1.intern() == sb3.intern());

    }
}
